QA@IT
«回答へ戻る

補足コメントを追加

5639
 
 ```
 var buffer = Encoding.UTF8.GetBytes("=" + pc_name);
+// サーバー側のvalue引数の値は pc_nameの値と同じになる
 ```
 
 もし以下のようにした場合最初の値のみ有効です
 ```
 var buffer = Encoding.UTF8.GetBytes("=" + pc_name + "&cpu_id=16");
+// サーバー側のvalue引数の値は pc_nameの値と同じになり、&以降は無視される
 ```
 
 複数の値をおくりたくてこれでは問題がある場合は、他の形式で送りサーバー側で分割することを検討してください。

通常のapplication/x-www-form-urlencoded においては、クエリ文字列の様に 名前=値&名前=値&...で渡せますが、WebApiに送る際、Request Bodyは=内容 の形になる必要があります。

イコールで始まり一つの値を送ることになります。
つまり以下の様にする必要があります。

var buffer = Encoding.UTF8.GetBytes("=" + pc_name);
// サーバー側のvalue引数の値は pc_nameの値と同じになる

もし以下のようにした場合最初の値のみ有効です

var buffer = Encoding.UTF8.GetBytes("=" + pc_name + "&cpu_id=16");
// サーバー側のvalue引数の値は pc_nameの値と同じになり、&以降は無視される

複数の値をおくりたくてこれでは問題がある場合は、他の形式で送りサーバー側で分割することを検討してください。

例えば Content-typeを application/json にした場合は以下のように渡せます。

var buffer = Encoding.UTF8.GetBytes("\"" + pc_name + "&cpu_id=16\"");
~中略~
request.ContentType = "application/json";

この結果サーバー側では前後の引用符の無い文字列が受け取れます。
仮にpc_nameaaaなら以下if文は成り立ちます。

public void Put(string pc_serial, [FromBody]string value) {
  if("aaa&cpu_id=16" == value) Debug.Print("出力される");
}

なお、jsonと指定していますが実際に受け取れるのはただの文字列でありオブジェクトではありません。

通常の`application/x-www-form-urlencoded` においては、クエリ文字列の様に `名前=値&名前=値&...`で渡せますが、WebApiに送る際、Request Bodyは`=内容` の形になる必要があります。

イコールで始まり一つの値を送ることになります。
つまり以下の様にする必要があります。

```
var buffer = Encoding.UTF8.GetBytes("=" + pc_name);
// サーバー側のvalue引数の値は pc_nameの値と同じになる
```

もし以下のようにした場合最初の値のみ有効です
```
var buffer = Encoding.UTF8.GetBytes("=" + pc_name + "&cpu_id=16");
// サーバー側のvalue引数の値は pc_nameの値と同じになり、&以降は無視される
```

複数の値をおくりたくてこれでは問題がある場合は、他の形式で送りサーバー側で分割することを検討してください。

例えば Content-typeを `application/json` にした場合は以下のように渡せます。

```csharp
var buffer = Encoding.UTF8.GetBytes("\"" + pc_name + "&cpu_id=16\"");
~中略~
request.ContentType = "application/json";
```

この結果サーバー側では前後の引用符の無い文字列が受け取れます。
仮に`pc_name`が `aaa`なら以下if文は成り立ちます。
```csharp
public void Put(string pc_serial, [FromBody]string value) {
  if("aaa&cpu_id=16" == value) Debug.Print("出力される");
}
```

なお、jsonと指定していますが実際に受け取れるのはただの文字列でありオブジェクトではありません。

回答を投稿

通常のapplication/x-www-form-urlencoded においては、クエリ文字列の様に 名前=値&名前=値&...で渡せますが、WebApiに送る際、Request Bodyは=内容 の形になる必要があります。

イコールで始まり一つの値を送ることになります。
つまり以下の様にする必要があります。

var buffer = Encoding.UTF8.GetBytes("=" + pc_name);

もし以下のようにした場合最初の値のみ有効です

var buffer = Encoding.UTF8.GetBytes("=" + pc_name + "&cpu_id=16");

複数の値をおくりたくてこれでは問題がある場合は、他の形式で送りサーバー側で分割することを検討してください。

例えば Content-typeを application/json にした場合は以下のように渡せます。

var buffer = Encoding.UTF8.GetBytes("\"" + pc_name + "&cpu_id=16\"");
~中略~
request.ContentType = "application/json";

この結果サーバー側では前後の引用符の無い文字列が受け取れます。
仮にpc_nameaaaなら以下if文は成り立ちます。

public void Put(string pc_serial, [FromBody]string value) {
  if("aaa&cpu_id=16" == value) Debug.Print("出力される");
}

なお、jsonと指定していますが実際に受け取れるのはただの文字列でありオブジェクトではありません。

通常の`application/x-www-form-urlencoded` においては、クエリ文字列の様に `名前=値&名前=値&...`で渡せますが、WebApiに送る際、Request Bodyは`=内容` の形になる必要があります。

イコールで始まり一つの値を送ることになります。
つまり以下の様にする必要があります。

```
var buffer = Encoding.UTF8.GetBytes("=" + pc_name);
```

もし以下のようにした場合最初の値のみ有効です
```
var buffer = Encoding.UTF8.GetBytes("=" + pc_name + "&cpu_id=16");
```

複数の値をおくりたくてこれでは問題がある場合は、他の形式で送りサーバー側で分割することを検討してください。

例えば Content-typeを `application/json` にした場合は以下のように渡せます。

```csharp
var buffer = Encoding.UTF8.GetBytes("\"" + pc_name + "&cpu_id=16\"");
~中略~
request.ContentType = "application/json";
```

この結果サーバー側では前後の引用符の無い文字列が受け取れます。
仮に`pc_name`が `aaa`なら以下if文は成り立ちます。
```csharp
public void Put(string pc_serial, [FromBody]string value) {
  if("aaa&cpu_id=16" == value) Debug.Print("出力される");
}
```

なお、jsonと指定していますが実際に受け取れるのはただの文字列でありオブジェクトではありません。