0

次の構造を持つ JSON オブジェクトを POST URL に送信するだけでよい U2F 準拠のクライアントを構築しています。

{
  challenge: [Base64-encoded String of 32 bytes],
  registrationData: [Base64-encoded String of variable bytes]
}

これは私のコードの抜粋です。これは正常に実行され、エラーはスローされません。

import okhttp3.FormBody;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;

public interface Registration {
  @POST("register")
  Call<ResponseBody> register(@Body RequestBody body);
}

private void sendRegistrationResponse(String baseURL, String challenge, String data) {
  RequestBody data = new FormBody.Builder()
                    .add("challenge", challengeB64)
                    .add("registrationData", data)
                    .build();

  Retrofit retro = new Retrofit.Builder()
                    .baseUrl(info.getString("baseURL"))
                    .build();

  U2FServices.Registration reg = retro.create(U2FServices.Registration.class);
  Call<ResponseBody> regCall = reg.register(data);
  regCall.enqueue(this);
}

デバッグ サーバーは Node.js で構築されており、その POST "登録" ルートは毎回クライアントによって正常に呼び出されます。問題は、リクエストの本文が常に空であることです。

exports.register = function (req, res) {
  var body = req.body; // {}
}

問題は にあるとFormBody.Builder()思いますが、それがどのように機能するかについて明確な例を示しているドキュメントやコードが見つかりません。どんな助けでも大歓迎です!

4

1 に答える 1

3

これを試してみましょう - (ノード サーバーが application/json を期待していることを願っています) または、その部分を変更する必要があります。

RequestBody data = RequestBody.create(MediaType.parse("application/json"), stringJson);

どうやら、FormBody のデフォルトのメディア タイプは「application/x-www-form-urlencoded」であり、ノード サーバーがこのリクエスト タイプを想定していない場合、失敗する可能性があります。

ノードの構成を調べることができる場合は、それを調べて、リクエストがどのメディア タイプで形成されるべきかを確認することをお勧めします。

これは Express サーバーの構成を持つノードの例です。

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

このノード サーバーは、json とフォーム URL の両方がエンコードされていることを期待できます。

これがうまくいくかどうか教えてください。

于 2016-06-23T18:46:35.297 に答える